package main

import "fmt"

/*
题目：一个整形数组，其中只有两个数字是不一样的，其他都是两两相同，找出这两个不同的数字
 */

func differentNum(nums []int) []int {
	length := len(nums)
	if length < 2 {
		return nil
	}
	// 先把所有数做异或操作
	temp := 0
	for i := 0; i < length; i++ {
		temp ^= nums[i]
	}
	// 把这个数转为二进制 找到第一个为 1 的位置
	count := 0
	for temp & 1 == 0 {
		temp >>= 1
		count ++
	}
	a := make([]int, 0)   // 1
	b := make([]int, 0)   // 0
	// 通过这一位为1的位置把数组分为两份
	for i := 0; i < length; i ++ {
		if (nums[i] >> count) & 1 == 1 {   // 这一位为1
			a = append(a, nums[i])
		}else {
			b = append(b, nums[i])
		}
	}
	fmt.Println(a, b)
	// 分别对这两个数组做异或 得到结果
	res := make([]int, 0)
	aa := 0
	for _, v := range a {
		aa ^= v
	}
	res = append(res, aa)
	bb := 0
	for _, v := range b {
		bb ^= v
	}
	res = append(res, bb)
	return res
}


func main() {
	fmt.Println(differentNum([]int{1,2,2,1,4,5}))
}
